package com.example.bestapp.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
 import android.graphics.Paint;
 import android.graphics.RectF;
 import android.util.AttributeSet;
 import android.view.View;

 import androidx.annotation.NonNull;

 /**
 * 自定义环形百分比视图
 * 功能：绘制一个白色圆环，并在圆环上叠加一个彩色圆弧，中间显示百分比文字
 */
public class RingPercentDemo extends View {
    // 圆心坐标
    private int mCircleX;
    private int mCircleY;

    // 圆环半径（默认80像素）
    private int mRadius = 80;

    // 绘制白色圆环的画笔
    private Paint mCirclePaint;

    // 圆弧的绘制区域（基于圆环的外接矩形）
    private RectF mRecF;

    // 圆弧起始角度（-90表示12点钟方向开始）
    private float mStartAngle = -90f;

    // 圆弧扫过的角度（负值表示逆时针方向）
    private float mSweepAngle = -45f;

    // 绘制彩色圆弧的画笔
    private Paint mRingPaint;

    // 文字绘制坐标
    private int mTextx;
    private int mTexty;

    // 绘制百分比文字的画笔
    private Paint mTextPaint;

    // 显示的百分比文字
    private String mTextStr;

    // 简单构造器（用于代码创建视图）
    public RingPercentDemo(Context context) {
        super(context);
        init();
    }

    // 带属性集的构造器（用于XML布局文件）
    public RingPercentDemo(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    /**
     * 初始化画笔和默认参数
     */
    private void init() {
        // 白色圆环画笔配置
        mCirclePaint = new Paint();
        mCirclePaint.setColor(Color.WHITE);       // 白色
        mCirclePaint.setStrokeWidth(15);          // 圆环宽度25px
        mCirclePaint.setStyle(Paint.Style.STROKE); // 只绘制轮廓
        mCirclePaint.setAntiAlias(true);          // 开启抗锯齿

        // 彩色圆弧画笔配置
        mRingPaint = new Paint();
        mRingPaint.setColor(Color.parseColor("#859BFF")); // 浅蓝色
        mRingPaint.setStrokeWidth(15);            // 圆弧宽度25px
        mRingPaint.setStyle(Paint.Style.STROKE);   // 只绘制轮廓
        mRingPaint.setAntiAlias(true);            // 开启抗锯齿

        // 文字画笔配置
        mTextPaint = new Paint();
        mTextPaint.setColor(Color.WHITE);         // 白色文字
        mTextPaint.setStyle(Paint.Style.FILL);    // 实心文字
        mTextPaint.setTextSize(40);               // 文字大小40px
        mTextPaint.setTextAlign(Paint.Align.CENTER); // 文字居中绘制
        mTextPaint.setAntiAlias(true);            // 开启抗锯齿

        mTextStr = "86%";  // 默认显示文本
    }

    /**
     * 当视图大小变化时调用
     * @param w    新宽度
     * @param h    新高度
     * @param oldw 旧宽度
     * @param oldh 旧高度
     */
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);

        // 将圆心定位在视图水平居中、1/2高度处
        mCircleX = w / 2;
        mCircleY = h / 2;

        // 文字绘制位置
        mTextx = mCircleX;
        mTexty = mCircleY+10;

        // 计算圆弧的绘制区域（基于圆环的外接矩形）
        mRecF = new RectF(
                mCircleX - mRadius,  // 左边界
                mCircleY - mRadius,  // 上边界
                mCircleX + mRadius, // 右边界
                mCircleY + mRadius   // 下边界
        );
    }

    /**
     * 绘制视图内容
     * @param canvas 画布对象
     */
    @Override
    protected void onDraw(@NonNull Canvas canvas) {
        super.onDraw(canvas);

        // 1. 绘制白色圆环
        canvas.drawCircle(mCircleX, mCircleY, mRadius, mCirclePaint);

        // 2. 绘制彩色进度圆弧
        // 参数：绘制区域、起始角度、扫过角度、是否连接圆心、画笔
        canvas.drawArc(mRecF, mStartAngle, mSweepAngle, false, mRingPaint);

        // 3. 绘制居中百分比文字
        // 参数：文字内容、x坐标、y坐标、画笔
        canvas.drawText(mTextStr, mTextx, mTexty, mTextPaint);
    }

    // -------------------- 扩展方法（供外部调用）-------------------- //

    /**
     * 设置圆环半径
     * @param radius 半径值（像素单位）
     */
    public void setRadius(int radius) {
        this.mRadius = radius;
        updateRectF();
        invalidate(); // 重绘视图
    }

    /**
     * 设置进度百分比
     * @param percent 百分比值（0-100）
     */
    public void setPercent(int percent) {
        this.mSweepAngle = -360 * percent / 100f; // 计算对应的角度
        this.mTextStr = percent + "%";            // 更新显示文字
        invalidate(); // 重绘视图
    }

    /**
     * 更新圆弧绘制区域
     */
    private void updateRectF() {
        mRecF.set(
                mCircleX - mRadius,
                mCircleY - mRadius,
                mCircleX + mRadius,
                mCircleY + mRadius
        );
    }
}